#ifndef __IANGELS_TENSOR_H__
#define __IANGELS_TENSOR_H__

#include <vector>

namespace iangels {

enum DataType {
    INT32 = 0,
    FLOAT32 = 1,
    DOUBLE = 2,
    INT64 = 3,
    FLOAT64 = 4,
    INT16 = 5,
    FLOAT16 = 6,
    INT8 = 7,
    FLOAT8 = 8,
    BOOL = 9,
    STRING = 10,
    UNKNOWN = 11
}; // DataType

template <typename T, int ELN>
struct FixedVector
{
    constexpr int kBytes = sizeof(T) * ELN;
    constexpr int kAlign = kBytes;

    char* addr;
}; // struct FixedVector

template <typename T, int ELN>
class LazyDynamicTensor {
public:
    using Vector = FixedVector<T, ELN>;
    using DataType = T;

    LazyDynamicTensor() {}
    ~LazyDynamicTensor() {}

    void expand(int size);
    void auto_reduce();

private:
    std::vector<int> vector_shape_;
    std::vector<Vector> data_;
}; // class Tensor

} // namespace iangels

#endif // __IANGELS_TENSOR_H__